From 3b9cc4898dce9c073acffb097953b228599e8d2f Mon Sep 17 00:00:00 2001 From: robertl Date: Sat, 22 Apr 2006 22:26:54 +0000 Subject: [PATCH] Add support for explorist routes on read and writes. --- magproto.c | 56 +++++++++++++++++++++++++++----- reference/route/magexplorist.rte | 6 ++++ testo | 6 ++++ 3 files changed, 60 insertions(+), 8 deletions(-) create mode 100644 reference/route/magexplorist.rte diff --git a/magproto.c b/magproto.c index a6f5c3b82..33baa95b3 100644 --- a/magproto.c +++ b/magproto.c @@ -1,7 +1,7 @@ /* Communicate Thales/Magellan serial protocol. - Copyright (C) 2002, 2003, 2004, 2005 Robert Lipe, robertlipe@usa.net + Copyright (C) 2002, 2003, 2004, 2005, 2006 Robert Lipe, robertlipe@usa.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -28,6 +28,7 @@ static int bitrate = 4800; static int wptcmtcnt; static int wptcmtcnt_max; +static int explorist; #define MYNAME "MAGPROTO" #define MAXCMTCT 200 @@ -68,6 +69,7 @@ typedef struct mag_rte_elem { */ typedef struct mag_rte_head { queue Q; /* Queue head for child rte_elems */ + char *rte_name; int nelems; } mag_rte_head; @@ -663,7 +665,7 @@ terminit(const char *portname, int create_ok) magfile_in = xfopen(portname, "rb", MYNAME); - is_file = !isatty(fileno(magfile_in)); + is_file = !isatty(fileno(magfile_in)) || explorist; if (is_file) { icon_mapping = map330_icon_table; mag_cleanse = m330_cleanse; @@ -741,7 +743,7 @@ arglist_t mag_fargs[] = { }; static void -mag_rd_init(const char *portname) +mag_rd_init_common(const char *portname) { time_t now, later; waypoint_read_count = 0; @@ -801,6 +803,20 @@ mag_rd_init(const char *portname) return; } +static void +mag_rd_init(const char *portname) +{ + explorist = 0; + mag_rd_init_common(portname); +} + +static void +magX_rd_init(const char *portname) +{ + explorist = 1; + mag_rd_init_common(portname); +} + static void mag_wr_init_common(const char *portname) { @@ -820,7 +836,7 @@ mag_wr_init_common(const char *portname) } #else magfile_out = xfopen(portname, "w+b", MYNAME); - is_file = !isatty(fileno(magfile_out)); + is_file = !isatty(fileno(magfile_out)) || explorist; #endif if (!mkshort_handle) { @@ -856,6 +872,7 @@ static void magX_wr_init(const char *portname) { wpt_len = 20; + explorist = 1; mag_wr_init_common(portname); setshort_length(mkshort_handle, wpt_len); setshort_whitespace_ok(mkshort_handle, 1); @@ -864,6 +881,7 @@ magX_wr_init(const char *portname) static void mag_wr_init(const char *portname) { + explorist = 0; wpt_len = 8; mag_wr_init_common(portname); /* @@ -959,11 +977,26 @@ mag_rteparse(char *rtemsg) static mag_rte_head *mag_rte_head; mag_rte_elem *rte_elem; char *p; + char *rte_name; descr[0] = 0; - +#if 0 sscanf(rtemsg,"$PMGNRTE,%d,%d,%c,%d%n", &frags,&frag,xbuf,&rtenum,&n); +#else + sscanf(rtemsg,"$PMGNRTE,%d,%d,%c,%d%n", + &frags,&frag,xbuf,&rtenum,&n); + + /* Explorist has a route name here */ + if (explorist) { + char rten[1024]; + int n2; + sscanf(rtemsg + n, ",%[^,]%n", rten, &n2); + n += n2; + rte_name = xstrdup(rten); + } + +#endif /* * This is the first component of a route. Allocate a new @@ -1012,6 +1045,7 @@ mag_rteparse(char *rtemsg) rte_head = route_head_alloc(); route_add_head(rte_head); rte_head->rte_num = rtenum; + rte_head->rte_name = xstrdup(rte_name); /* * It is quite feasible that we have 200 waypoints, @@ -1384,10 +1418,16 @@ mag_route_trl(const route_head * rte) if ((tmp == &rte->waypoint_list) || ((i % 2) == 0)) { thisline++; - - sprintf(obuff, "PMGNRTE,%d,%d,c,%d,%s,%s", + char expbuf[1024]; + expbuf[0] = 0; + if (explorist) { + snprintf(expbuf, sizeof(expbuf), "%s,", + rte->rte_name ? rte->rte_name : ""); + } + sprintf(obuff, "PMGNRTE,%d,%d,c,%d,%s%s,%s", numlines, thisline, rte->rte_num ? rte->rte_num : route_out_count, + expbuf, buff1, buff2); mag_writemsg(obuff); @@ -1471,7 +1511,7 @@ ff_vecs_t mag_fvecs = { ff_vecs_t magX_fvecs = { ff_type_file, FF_CAP_RW_ALL, - mag_rd_init, + magX_rd_init, magX_wr_init, mag_deinit, mag_deinit, diff --git a/reference/route/magexplorist.rte b/reference/route/magexplorist.rte new file mode 100644 index 000000000..0ca044eda --- /dev/null +++ b/reference/route/magexplorist.rte @@ -0,0 +1,6 @@ +$PMGNWPL,3408.881,N,11750.002,W,0000356,M,WPT006,,a*2D +$PMGNWPL,3403.376,N,11742.897,W,0000273,M,WPT007,,a*25 +$PMGNWPL,3401.816,N,11751.349,W,0000226,M,WPT008,,a*2F +$PMGNWPL,3405.686,N,11751.836,W,0000201,M,WPT009,,a*2B +$PMGNRTE,2,1,c,1,Route 1,WPT006,a,WPT007,a*63 +$PMGNRTE,2,2,c,1,Route 1,WPT008,a,WPT009,a*60 diff --git a/testo b/testo index 9dc778743..bf459aaa2 100755 --- a/testo +++ b/testo @@ -163,6 +163,12 @@ compare ${TMPDIR}/magfile ${REFERENCE}/magfile ${PNAME} -i magellan -f ${REFERENCE}/magfile -o magellanx -F ${TMPDIR}/magfile2 compare ${TMPDIR}/magfile2 ${REFERENCE}/magfile +# Magellanx routes, however, have an extra 'name' field in them. +${PNAME} -r -i magellanx -f ${REFERENCE}/route/magexplorist.rte -o magellanx -F ${TMPDIR}/magxfile.rte +${PNAME} -r -i magellanx -f ${TMPDIR}/magxfile.rte -o magellanx -F ${TMPDIR}/magxfile2.rte +compare ${TMPDIR}/magxfile2.rte ${REFERENCE}/route/magexplorist.rte + + # Navitrak DNA marker format ${PNAME} -i dna -f ${REFERENCE}/dnatest.txt -o dna -F ${TMPDIR}/dnatest.txt compare ${TMPDIR}/dnatest.txt ${REFERENCE}/dnatest.txt -- 2.30.2